﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Markup;

namespace X3DXNA.X3DSchema
{
    public interface INode 
    {
        String DEF { get; set; }
        String USE { get; set; }
        List<INode> Childs { get; set; }    
    }

    [ContentProperty("Childs")]
    public class X3D : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String profile { get; set; }
        public String version { get; set; }
        public String xsd { get; set; }
        public String xmlns { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child= new List<INode>();
    }

    [ContentProperty("Childs")]
    public class Group : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class head : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    public class component : INode
    {
        public String name { get; set; }
        public String level { get; set; }

        public String DEF { get; set; }
        public String USE { get; set; }
        public List<INode> Childs { get { return null; } set { } }
    }

    public class meta : INode
    {
        public String name { get; set; }
        public String content { get; set; }

        public String DEF { get; set; }
        public String USE { get; set; }
        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class Scene : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    public class WorldInfo : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public List<INode> Childs { get { return null; } set { } }

        public String title { get; set; }
        public String info { get; set; }
    }

    [ContentProperty("Childs")]
    public class Shape : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class Appearance : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    public class Material : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String diffuseColor { get; set; }
        public String emissiveColor { get; set; }
        public String specularColor { get; set; }
        public String shininess { get; set; }
        public String ambientIntensity { get; set; }
        public String transparency { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    public class Box : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String containerField { get; set; }
        public String size { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    public class Viewpoint : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String description { get; set; }
        public String position { get; set; }
        public String orientation { get; set; }
        public String fieldOfView { get; set; }
        public String jump { get; set; }
        public String centerOfRotation { get; set; }
        public String set_bind { get; set; }
        public String bindTime { get; set; }
        public String isBound { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class Transform : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String translation { get; set; }
        public String rotation { get; set; }
        public String scale { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class Sphere : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String radius { get; set; }
        public String containerField { get; set; }
        
        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class Cylinder : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String height { get; set; }
        public String radius { get; set; }
        public String top { get; set; }
        public String bottom { get; set; }
        public String solid { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class Cone : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String height { get; set; }
        public String bottomRadius { get; set; }
        public String side { get; set; }
        public String bottom { get; set; }
        public String solid { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class IndexedFaceSet : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String coordIndex { get; set; }
        public String ccw { get; set; }
        public String convex { get; set; }
        public String solid { get; set; }
        public String creaseAngle { get; set; }
        public String colorPerVertex { get; set; }
        public String colorIndex { get; set; }
        public String normalPerVertex { get; set; }
        public String normalIndex { get; set; }
        public String texCoordIndex { get; set; }
        public String containerField { get; set; }
    
        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class IndexedTriangleSet : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String index { get; set; }
        public String ccw { get; set; }
        public String colorPerVertex { get; set; }
        public String colorIndex { get; set; }
        public String normalPerVertex { get; set; }
        public String solid { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class Coordinate : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String point { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class NavigationInfo : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String type { get; set; }
        public String speed { get; set; }
        public String headlight { get; set; }
        public String avatarSize { get; set; }
        public String visibilityLimit { get; set; }
        public String transitionType { get; set; }
        public String transitionTime { get; set; }
        public String transitionComplete { get; set; }
        public String set_bind { get; set; }
        public String bindTime { get; set; }
        public String isBound { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class Background : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String skyColor { get; set; }
        public String skyAngle { get; set; }
        public String groundColor { get; set; }
        public String groundAngle { get; set; }
        public String frontUrl { get; set; }
        public String backUrl { get; set; }
        public String leftUrl { get; set; }
        public String rightUrl { get; set; }
        public String topUrl { get; set; }
        public String bottomUrl { get; set; }
        public String set_bind { get; set; }
        public String bindTime { get; set; }
        public String isBound { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class ProximitySensor : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String enabled { get; set; }
        public String center { get; set; }
        public String size { get; set; }
        public String isActive { get; set; }
        public String position_changed { get; set; }
        public String orientation_changed { get; set; }
        public String centerOfRotation_changed { get; set; }
        public String enterTime { get; set; }
        public String exitTime { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class Sound : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String location { get; set; }
        public String direction { get; set; }
        public String intensity { get; set; }
        public String minFront { get; set; }
        public String minBack { get; set; }
        public String maxFront { get; set; }
        public String maxBack { get; set; }
        public String priority { get; set; }
        public String spatialize { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs
        {
            get { return _Child; }
            set { _Child.Add(value.First()); }
        }

        private List<INode> _Child = new List<INode>();
    }

    [ContentProperty("Childs")]
    public class AudioClip : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String description { get; set; }
        public String url { get; set; }
        public String loop { get; set; }
        public String pitch { get; set; }
        public String startTime { get; set; }
        public String stopTime { get; set; }
        public String duration_changed { get; set; }
        public String isActive { get; set; }
        public String isPaused { get; set; }
        public String pauseTime { get; set; }
        public String resumeTime { get; set; }
        public String elapsedTime { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class TextureCoordinate : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String point { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class Normal : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String vector { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class ImageTexture : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String url { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class TimeSensor : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String enabled { get; set; }
        public String cycleInterval { get; set; }
        public String loop { get; set; }
        public String startTime { get; set; }
        public String stopTime { get; set; }
        public String pauseTime { get; set; }
        public String resumeTime { get; set; }
        public String cycleTime { get; set; }
        public String isActive { get; set; }
        public String isPaused { get; set; }
        public String fraction_changed { get; set; }
        public String time { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class OrientationInterpolator : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String key { get; set; }
        public String keyValue { get; set; }
        public String set_fraction { get; set; }
        public String value_changed { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class ROUTE : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }

        public String fromNode { get; set; }
        public String fromField { get; set; }
        public String toNode { get; set; }
        public String toField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class ColorInterpolator : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String key { get; set; }
        public String keyValue { get; set; }
        public String set_fraction { get; set; }
        public String value_changed { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class PositionInterpolator : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String key { get; set; }
        public String keyValue { get; set; }
        public String set_fraction { get; set; }
        public String value_changed { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }

    [ContentProperty("Childs")]
    public class TouchSensor : INode
    {
        public String DEF { get; set; }
        public String USE { get; set; }
        public String description { get; set; }
        public String enabled { get; set; }
        public String isActive { get; set; }
        public String isOver { get; set; }
        public String hitPoint_changed { get; set; }
        public String hitNormal_changed { get; set; }
        public String hitTexCoord_changed { get; set; }
        public String touchTime { get; set; }
        public String containerField { get; set; }

        public List<INode> Childs { get { return null; } set { } }
    }
}
